package es.ucm.fdi.xtremeaudio.modelo.fachada;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JOptionPane;

import es.ucm.fdi.xtremeaudio.controlador.Controlador;
import es.ucm.fdi.xtremeaudio.modelo.beans.Bean;
import es.ucm.fdi.xtremeaudio.modelo.beans.Biblioteca;
import es.ucm.fdi.xtremeaudio.modelo.beans.Cancion;
import es.ucm.fdi.xtremeaudio.modelo.dao.Dao;
import es.ucm.fdi.xtremeaudio.modelo.excepciones.ExcepcionDao;
import es.ucm.fdi.xtremeaudio.modelo.excepciones.ReaderException;
import es.ucm.fdi.xtremeaudio.vista.FormPrincipal;

/**
 * <ul>
 * <li><b>Proyecto:</b> XtremeAudio</li>
 * <li><b>Grupo:</b> 7 <i>(4&deg;B)</i></li>
 * <li><b>Asignatura:</b> Ingenier&iacute;a del Software</li>
 * <li><b>Curso:</b> 2010/2011</li>
 * <li><b>Centro:</b> Universidad Complutense de Madrid</li>
 * </ul>
 * 
 * La <b>Fachada</b> sirve para comunicar el Controlador con el Modelo, de
 * manera que toda orden (en cualquiera de las dos direcciones) se transmite y
 * ordena procesar a trav&eacute;s de esta clase. Adem&aacute;s se encarga de
 * capturar y tratar las excepciones que le lanza el Modelo.
 * 
 * @author &Aacute;lvaro G&oacute;mez Porris
 * @author Elena Hern&aacute;ndez Delgado
 * @author Mar&iacute;a Trinidad Mart&iacute;n Campos
 * @author Mois&eacute;s Mart&iacute;nez Montes
 * @author Mat&iacute;as Salinero Delgado
 * 
 * @version %I%, %G%
 * 
 * @since 1.0
 * 
 * @see Controlador
 * @see Dao
 */
public class Fachada {

	private static Dao dao = new Dao();

	/**
	 * Ordena al modelo que conmute su modo aleatorio.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean aleatorio() {
		Bean bean = null;
		bean = dao.aleatorio();
		return bean;
	}

	/**
	 * Ordena al modelo que reproduzca la canci&oacute;n anterior a la actual.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean anterior() {
		Bean bean = null;
		bean = dao.anterior();
		return bean;
	}

	/**
	 * Ordena al modelo que avance la canci&oacute;n actual una determinada
	 * cantidad de bytes (equivalente a segundos).
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean avanzar() {
		Bean bean = null;
		bean = dao.avanzar();
		return bean;
	}

	/**
	 * Ordena al modelo que busca un texto determinado entre las canciones de la
	 * biblioteca.
	 * 
	 * @param texto
	 *            El texto a buscar.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean buscar(String texto) {
		Bean bean = null;
		bean = dao.buscar(texto);
		return bean;
	}

	/**
	 * Ordena al modelo que cambie de lista actual que se est&aacute; mostrando
	 * en la vista.
	 * 
	 * @param idLista
	 *            El identificador de la nueva lista a mostrar.
	 * 
	 * @return El bean actualizado.
	 * 
	 * @see FormPrincipal
	 */
	public static Bean cambiaLista(int idLista) {
		Bean bean = null;
		bean = dao.cambiaLista(idLista);
		return bean;
	}

	/**
	 * Ordena al modelo que cambie el tiempo actual de reproducci&oacute;n.
	 * 
	 * @param segundos
	 *            El nuevo tiempo en segundos.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean cambiaTiempo(int segundos) {
		Bean bean = null;
		bean = dao.cambiaTiempo(segundos);
		return bean;
	}

	/**
	 * Ordena al modelo que que cambie el nievel actual de volumen.
	 * 
	 * @param vol
	 *            El nuevo valor del volumen (entre 0 y 100).
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean cambiaVolumen(int vol) {
		Bean bean = null;
		bean = dao.setGanancia(vol);
		return bean;
	}

	/**
	 * Ordena al modelo que cargue la biblioteca.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean cargarBiblioteca() {
		Bean bean = null;
		try {
			bean = dao.cargarBiblioteca();
		} catch (ReaderException e) {
			e.printStackTrace();
		}
		return bean;
	}

	/**
	 * Ordena al modelo que cree una nueva lista de reproducci&oacute;n.
	 * 
	 * @param padre
	 *            El formulario padre.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean crearLista(JFrame padre) {
		Bean bean = null;
		bean = dao.crearLista(padre);
		return bean;
	}

	/**
	 * Ordena al modelo que ejecute la acci&oacute; asociada a un doble clic o
	 * la pulsaci&oacute; de la tecla intro en la lista de canciones.
	 * 
	 * @param fila
	 *            La fila donde se gener&oacute; el evento.
	 * 
	 * @return El bean actualizado.
	 * 
	 * @see FormPrincipal
	 */
	public static Bean dobleClickIntro(int fila) {
		Bean bean = null;
		bean = dao.dobleClickIntro(fila);
		return bean;

	}

	/**
	 * Ordena al modelo que elimine una serie de canciones seleccionadas en la
	 * vista.
	 * 
	 * @return El bean actualizado.
	 * 
	 * @see FormPrincipal
	 */
	public static Bean eliminar() {
		Bean bean = null;
		bean = dao.eliminar();
		return bean;
	}

	/**
	 * Ordena al modelo que genere el men&uacute; contextual correspondiente
	 * tras haberse hecho clic con el bot&oacute;n derecho del rat&oacute;n.
	 * 
	 * @param menu
	 *            El men&uacute; al que agregar &iacute;tems.
	 * @param filas
	 *            Las filas seleccionadas en el momento de hacer clic.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean generaMenuContextual(JMenu menu, int[] filas) {
		Bean bean = null;
		bean = dao.generaMenuContextual(menu, filas);
		return bean;
	}

	/**
	 * Devuelve el bean con el estado general actual.
	 * 
	 * @return El bean.
	 */
	public static Bean getBean() {
		return dao.getBean();
	}

	/**
	 * Ordena al modelo que guarde una copia de una lista con otro nombre.
	 * 
	 * @param padre
	 *            El formulario padre.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean guardaListaComo(JFrame padre) {
		Bean bean = null;
		bean = dao.guardaListaComo(padre);
		return bean;
	}

	/**
	 * Ordena al modelo que guarde la lista actual mostrada en la vista.
	 */
	public static void guardar() {
		dao.guardar();
	}

	/**
	 * Ordena al modelo que guarde los tags editables de una canci&oacute;n.
	 * 
	 * @param oCancion
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean guardarTags(Cancion oCancion) {
		Bean bean = null;
		try {
			bean = dao.guardarTags(oCancion);
			return bean;
		} catch (ExcepcionDao e) {
			e.printStackTrace();
		}
		return bean;
	}

	/**
	 * Ordena al modelo que importe archivos sueltos a la biblioteca.
	 * 
	 * @param padre
	 * 
	 * @return El bean actualizado.
	 * 
	 * @see Biblioteca
	 */
	public static Bean importarArchivos(JFrame padre) {
		Bean bean = null;
		bean = dao.importarArchivos(padre);
		return bean;
	}

	/**
	 * Ordena al modelo que importe una carpeta (y sus posibles subcarpetas) a
	 * la biblioteca.
	 * 
	 * @param padre
	 *            El formulario padre.
	 * 
	 * @return El bean actualizado.
	 * 
	 * @see Biblioteca
	 */
	public static Bean importarCarpeta(JFrame padre) {
		Bean bean = null;
		bean = dao.importarCarpeta(padre);
		return bean;
	}

	/**
	 * Ordena al modelo que limpie (elimine todo) la lista actual mostrada en la
	 * vista.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean limpiar() {
		Bean bean = null;
		bean = dao.limpiar();
		return bean;
	}

	/**
	 * Ordena al modelo que conmute su estado de sonido/silencio.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean mute() {
		Bean bean = null;
		bean = dao.mute();
		return bean;
	}

	/**
	 * Ordena al modelo que ejecute la acci&oacute;n asociada al bot&oacute;n de
	 * play/pausa (reproducir, pausar o continuar).
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean playPausa() {
		Bean bean = null;
		bean = dao.playPausa();
		return bean;
	}

	/**
	 * Ordena al modelo que cambie el modo de repetici&oacute;n actual.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean repetir() {
		Bean bean = null;
		bean = dao.repetir();
		return bean;
	}

	/**
	 * Ordena al modelo que retroceda una determinada cantidad de bytes
	 * (equivalente a segundos) de la canci&oacute;n actual.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean retroceder() {
		Bean bean = null;
		bean = dao.retroceder();
		return bean;
	}

	/**
	 * Ordena al modelo que reproduzca la canci&oacute;n siguiente a la actual.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean siguiente() {
		Bean bean = null;
		bean = dao.siguiente();
		return bean;
	}

	/**
	 * Ordena al modelo que detenga la reproducci&oacute;n actual.
	 * 
	 * @return El bean actualizado.
	 */
	public static Bean stop() {
		Bean bean = null;
		bean = dao.stop();
		return bean;
	}

}